home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / util / pack / xfh132.lzh / XFH / src / libmygcc / gnulib / common.h next >
C/C++ Source or Header  |  1993-01-16  |  3KB  |  81 lines

  1. #include <exec/types.h>
  2. #undef FLOAT
  3.  
  4. #include "types.h"
  5. #define FLOAT SFVALUE
  6.  
  7. #define lowpart(a) ((unsigned short)a)
  8. #define highpart(a) ((unsigned short)((a)>>16))
  9.  
  10. static inline unsigned long
  11. mulu (unsigned long u, unsigned long v)
  12. {
  13.   register unsigned long result asm("d0");
  14.  
  15.   asm volatile ("
  16.     movel    %1,d0
  17.     movel    %2,d1
  18.     movel    d0,d2
  19.     movel    d1,d3
  20.     swap    d2
  21.     swap    d3
  22.     mulu    d1,d2
  23.     mulu    d0,d3
  24.     mulu    d1,d0
  25.     addw    d3,d2
  26.     swap    d2
  27.     clrw    d2
  28.     addl    d2,d0"
  29.     : "=r" (result)
  30.     : "g" (u), "g" (v)
  31.     : "d0", "d1", "d2", "d3");
  32.   return result;
  33. }
  34.  
  35. #define divmodu(q, r, n, d) \
  36. ({ register unsigned long rq asm("d0"), rr asm("d1");    \
  37.                             \
  38.    asm volatile ("                    \
  39.        movel    %2,d0;                    \
  40.        movel    %3,d1;                    \
  41.     cmpl    #0xffff,d1;                \
  42.     bhi    full_division;                \
  43.     movel    d1,d3;                    \
  44.     swap    d0;                                      \
  45.     movew    d0,d3;                                   \
  46.     beq    L12345;                                  \
  47.     divu    d1,d3;                                   \
  48.     movew    d3,d0;                                   \
  49.    L12345:                                               \
  50.     swap    d0;                                      \
  51.     movew    d0,d3;                                   \
  52.     divu    d1,d3;                                   \
  53.     movew    d3,d0;                                   \
  54.     swap    d3;                                      \
  55.     movew    d3,d1;                                   \
  56.     bra    common_end;                              \
  57.                                                         \
  58.    full_division:                                       \
  59.     movel    d1,d3;                                   \
  60.     movel    d0,d1;                                   \
  61.     clrw    d1;                                      \
  62.     swap    d1;                                      \
  63.     swap    d0;                                      \
  64.     clrw    d0;                                      \
  65.     moveq    #15,d2;                                  \
  66.    divloop:                                             \
  67.     addl    d0,d0;                                   \
  68.     addxl    d1,d1;                                   \
  69.     cmpl    d1,d3;                                   \
  70.     bhi    L12346;                                  \
  71.     subl    d3,d1;                                   \
  72.     addqw    #1,d0;                                   \
  73.    L12346:                                               \
  74.     dbra    d2,divloop;                              \
  75.                                                         \
  76.    common_end:"                                         \
  77.    : "=r" (rq), "=r" (rr)                               \
  78.    : "g" (n), "g" (d)                                   \
  79.    : "d0", "d1", "d2", "d3");                           \
  80.    q = rq; r = rr;})
  81.